/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.gbvbahia.projeto.make;

import br.com.gbvbahia.maker.types.complex.MakeString;
import br.com.gbvbahia.maker.types.primitives.numbers.MakeInteger;
import br.com.gbvbahia.maker.works.MakeEmail;
import br.com.gbvbahia.maker.works.MakePassword;
import br.com.gbvbahia.projeto.beans.facade.interfaces.UsuarioFacade;
import br.com.gbvbahia.projeto.entidades.Usuario;
import br.com.gbvbahia.projeto.exceptions.NegocioException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Guilherme
 */
public class MakeUsuario {

    /**
     * Cria um usuário definindo os atributos não nulos. Esse usuário
     * não existe no banco de dados.
     *
     * @return Usuario
     */
    public static Usuario getUsuarioDefinido() {
        Usuario toReturn = new Usuario("test01");
        toReturn.setPass("123");
        toReturn.setBlocked(false);
        toReturn.setEmail("teste01@gmail.com");
        toReturn.setFirstName("Teste01_First");
        toReturn.setLastName("Teste01_Last");
        return toReturn;
    }

    /**
     * Cria um usuário de getUsuarioDefinido(), grava-o no banco de
     * dados e o devolve.
     *
     * @param facade Necessário para gravar o mesmo.
     * @return Usuario gravado no banco.
     * @throws Exception Se algo der errado.
     */
    public static Usuario getUsuarioDefinido(final UsuarioFacade facade)
            throws Exception {
        Usuario user = getUsuarioDefinido();
        facade.create(user);
        return user;
    }

    /**
     * Cria um usuário aleatório, não gravado no BD.
     *
     * @return Usuário com dados aleatórios.
     */
    public static Usuario getUsuarioAleatorio() {
        Usuario user = new Usuario();
        user.setEmail(MakeEmail.getEmail());
        user.setFirstName(MakeString.getString(MakeInteger.getIntervalo(1, 50), MakeString.StringType.LETTER));
        user.setLastName(MakeString.getString(MakeInteger.getIntervalo(1, 50),  MakeString.StringType.LETTER));
        user.setPass(MakePassword.getPassword(MakeInteger.getIntervalo(1, 10)));
        user.setUserId(MakeString.getString(MakeInteger.getIntervalo(1, 10), MakeString.StringType.LETTER));
        return user;
    }

    /**
     * Cria um usuário com dados aleatórios e salva o mesmo no BD
     * antes de retornar.
     *
     * @param facade Bean para salva o usuário
     * @return Usuario salvo no BD.
     */
    public static Usuario getUsuarioAleatorio(UsuarioFacade facade)
            throws NegocioException {
        Usuario user = getUsuarioAleatorio();
        facade.create(user);
        return user;
    }

    /**
     * Devolve uma lista com usuários criados aleatoriamente. Não
     * salvos no BD.
     *
     * @param qtdade Total de usuários a serem incluídos na lista.
     * @return List de usuários.
     */
    public static List<Usuario> getUsuarioAleatorio(final int qtdade) {
        List<Usuario> users = new ArrayList<Usuario>(qtdade);
        for (int i = 0; i < qtdade; i++) {
            users.add(getUsuarioAleatorio());
        }
        return users;
    }

    /**
     * Cria uma lista de usuários e salva todos no banco de dados.
     * Dados aleatorios.
     * @param qtdade Determina o tamanho da lista.
     * @param facade Objeto para salvar os mesmos no BD.
     * @return Lista com usuários salvos no DB.
     * @throws NegocioException Se algum usuário se repetir essa exceção
     * poderá ser lançada e o teste dará errado, é possivel, mas pouco
     * provavel que isso ocorra.
     */
    public static List<Usuario> getUsuarioAleatorio(final int qtdade,
            final UsuarioFacade facade) throws NegocioException {
        List<Usuario> users = getUsuarioAleatorio(qtdade);
        for (int i = 0; i < users.size(); i++) {
            facade.create(users.get(i));
        }
        return users;
    }
}
